package ma.cdm.compteRendu.services;

import java.util.ArrayList;
import java.util.List;

import ma.cdm.compteRendu.bo.Comite;
import ma.cdm.compteRendu.bo.MembreComite;
import ma.cdm.compteRendu.bo.Role;
import ma.cdm.compteRendu.dao.ComiteDAO;
import ma.cdm.compteRendu.dao.MembreComiteDAO;
import ma.cdm.compteRenduVO.ComiteVO;
import ma.cdm.compteRenduVO.PersonneVO;
import ma.cdm.compteRenduVO.RoleVO;
import ma.cdm.compteRenduVO.UserComiteVO;

import org.springframework.beans.factory.annotation.Autowired;

public class ComiteService {

	@Autowired
	private ComiteDAO comiteDAO;
	
	@Autowired
    private MembreComiteDAO membreComiteDAO;
	
	@Autowired
	private PersonneService personneService;
	
	
	public PersonneService getPersonneService() {
		return personneService;
	}

	public void setPersonneService(PersonneService personneService) {
		this.personneService = personneService;
	}

	public ComiteDAO getComiteDAO() {
		return comiteDAO;
	}

	public void setComiteDAO(ComiteDAO comiteDAO) {
		this.comiteDAO = comiteDAO;
	}

	
	public MembreComiteDAO getMembreComiteDAO() {
		return membreComiteDAO;
	}

	public void setMembreComiteDAO(MembreComiteDAO membreComiteDAO) {
		this.membreComiteDAO = membreComiteDAO;
	}

	public UserComiteVO getUserComites(String login)
	{	
		UserComiteVO ucomites = new UserComiteVO();
		if(login == null)
		{
			return ucomites;
		}
		ucomites.setUserID(login);
		List<ComiteVO> comites = new ArrayList<ComiteVO>();
	
		List<Comite> comitesBO = comiteDAO.getUserComite(login);
		for (Comite comite : comitesBO) {
			ComiteVO com = new ComiteVO(""+comite.getIdcomite(),comite.getLibellecomite(),comite.getDescriptioncomite());
			comites.add(com);			
		}
		ucomites.setComites(comites);
		return ucomites;
	}

	public ComiteVO getComiteDetails(ComiteVO comite)
	{

		List<PersonneVO> personnes = new ArrayList<PersonneVO>();
		List<MembreComite> membres = membreComiteDAO.findMembreByComite(Long.parseLong(comite.getComiteID()));
		for (MembreComite membreComite : membres) {
			PersonneVO personne = personneService.getPersonneShortData(membreComite.getMatricule());
			if(personne == null)
			{
				continue;
			}
			Role role = membreComiteDAO.getRoleDAO().getPersonneComiteRole(personne.getMatricule(), Long.parseLong(comite.getComiteID()));					
			personne.setRole(new RoleVO(""+role.getIdrole(),role.getLibellerole(),role.getDescriptionrole()));
			personnes.add(personne);
		}
    	comite.setPersonnes(personnes);
		return comite;
	}
	
	@SuppressWarnings("unchecked")
	public List<ComiteVO> getAllComites()
	{
		List<Comite> comitesBO = comiteDAO.findAll();
		List<ComiteVO> comites = new ArrayList<ComiteVO>();
		for(Comite comite : comitesBO)
		{
			ComiteVO comitevo = new ComiteVO();
			comitevo.setComiteDescription(comite.getDescriptioncomite());
			comitevo.setComiteID(comite.getIdcomite()+"");
			comitevo.setComiteLibelle(comite.getLibellecomite());	
			comites.add(comitevo);
		}
		return comites;
	}
	
	public ComiteVO ajouterComite(ComiteVO comite)
	{
		if(comite == null)
		{
			return null ;
		}
		Comite toSave = new Comite(comite.getComiteLibelle(),comite.getComiteDescription(),null,null);
		comiteDAO.save(toSave);
		return new ComiteVO(""+toSave.getIdcomite(),toSave.getLibellecomite(),toSave.getDescriptioncomite());
	}
	
	
	public void deleteComite(ComiteVO comite)
	{
		if(comite == null)
		{
			return ;
		}
		Comite toDelete = new Comite(comite.getComiteLibelle(),comite.getComiteDescription(),null,null);
		toDelete.setIdcomite(Long.parseLong(comite.getComiteID()));
		comiteDAO.delete(toDelete);
	}
	
	@SuppressWarnings("unchecked")
	public List<RoleVO> getAllRoles()
	{
		List<RoleVO> roles = new ArrayList<RoleVO>();
		try {
			List<Role> rolesBo =  membreComiteDAO.getRoleDAO().findAll();
			for (Role rolebo : rolesBo) {
				RoleVO role = new RoleVO();
				role.setRoleId(""+rolebo.getIdrole());
				role.setRoleLibelle(rolebo.getLibellerole());
				role.setRoleDescription(rolebo.getDescriptionrole());
				roles.add(role);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return roles;
	}
	
	public ComiteVO updateComite(ComiteVO comite)
	{
		if(comite == null)
		{
			return  null;
		}
		
		Comite toUpdate = new Comite(comite.getComiteLibelle(),comite.getComiteDescription(),null,null);
		toUpdate.setIdcomite(Long.parseLong(comite.getComiteID()));
		List<PersonneVO>  personnes =comite.getPersonnes();
		
		comiteDAO.cleanComiteMembres(toUpdate.getIdcomite());
		comiteDAO.attachDirty(toUpdate);
        for (PersonneVO personneVO : personnes) {
			membreComiteDAO.addMembreToComite(personneVO.getMatricule(), toUpdate.getIdcomite(), Long.parseLong(personneVO.getRole().getRoleId()));			
		}
		return comite;
	}
	
	
}
